﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Application.Expand
{
    public static class ExpressionQueryInt
    {
        public static IQueryable<TSource> DtoWhereInt<TSource, TDto>(this IQueryable<TSource> source, TDto? Dto)
        {

            var sProps = typeof(TSource).GetProperties();//反射出表的属性
            var dProps = typeof(TDto).GetProperties();//反射出dto的属性
                                                      //拿到dto表中属性都是int类型，并且属性名称 和表的名称一致的
            var dtoPros = dProps.Where(x => x.PropertyType.FullName == typeof(int).FullName && sProps.Any(y => y.Name == x.Name));
            foreach (var dtoProp in dtoPros)
            {
                if (dtoProp != null && dtoProp.GetValue(Dto) != null) // 判断 dtoProp和value 是否为空
                {
                    var value = (int)dtoProp.GetValue(Dto);//遍历出属性的值
                    if (!Equals(value, 0) )//如果不为空就构建表达式
                    {
                        var func = WhereFunc<TSource>(dtoProp.Name, value);//给到属性名称和属性的值
                        source = source.Where(func);

                    }
                }              
            }
                return source;

            }

        public static Expression<Func<TSource, bool>> WhereFunc<TSource>(string propName, int value)
        {
            ParameterExpression entityPar = Expression.Parameter(typeof(TSource), name: "x");//创建参数节点 节点类型就是表

            var entityParT1 = Expression.Property(entityPar, propName);//此时生成一个左节点为  entityParT1: x.T1
            ConstantExpression dtoValue = Expression.Constant(value, typeof(int));//创建右节点 将dto的属性值放在右边

 
            
            BinaryExpression greaterThanExp = Expression.Equal(entityParT1, dtoValue); //生成表达式 
            //创建最终的lambda表达式  
            //此时的表达式为whereLambda:x=>x.T1.Equal(value)
            var whereLambda = Expression.Lambda<Func<TSource, bool>>(greaterThanExp, entityPar);
            return whereLambda;
        }


    }
}
